<?php

require_once 'BancoDeDados.php';

class Entidade {

    private $cod_entidade;
    private $nome;
    private $descricao;
    private $possiveis_valores = array();

    public function setCod_entidade(&$cod_entidade) {
        $this->cod_entidade = &$cod_entidade;
    }

    public function &getCod_entidade() {
        return $this->cod_entidade;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getDescricao() {
        return $this->descricao;
    }
    
    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    public function &getNome() {
        return $this->nome;
    }
    
    /**
     *
     * @return array
     */
    public function &getPossiveis_valores() {
        return $this->possiveis_valores;
    }
    
    public function setPossiveis_valores(array &$possiveis_valores) {
        $this->possiveis_valores = &$possiveis_valores;
    }

    public function cadastrar() {
        if (!$this->validar()) {
            throw new Exception("Entidade existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into entidade(nome, descricao) values(?,?)');
        $result = $link->execute($stmt, array($this->nome, $this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $temp = &$this->nome;
            $this->nome = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Entidade existente |".$temp);
            }
        } else if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update entidade set ' . $campo_id . ' = ? where cod_entidade = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_entidade));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage()." |".$temp);
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from entidade where cod_entidade = ?');
        $result = $link->execute($stmt, array($this->cod_entidade));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from entidade order by nome');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $entidade = new Entidade();
            $entidade->setCod_entidade($row['cod_entidade']);
            $entidade->setDescricao($row['descricao']);
            $entidade->setNome($row['nome']);
            $resultado[] = &$entidade;
            unset($entidade);
        }
        return $resultado;
    }

    public static function &consultar($cod_entidade) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_entidade, descricao, nome from entidade where cod_entidade = ?', array($cod_entidade));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Entidade inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Entidade com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $entidade = new Entidade();
        $entidade->setCod_entidade($row['cod_entidade']);
        $entidade->setDescricao($row['descricao']);
        $entidade->setNome($row['nome']);
        return $entidade;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_entidade from entidade where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = true;
        if ($result->numRows() == 1) {
            $resultado = false;
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Entidade com o mesmo identificador, informe ao administrador");
        }
        return $resultado;
    }
    
    public function isVinculado() {
        return 0; 
    }
}
?>